/***********************************************************************************
 * 文件名： mcu_flash.c
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		FLASH驱动。
 * 修改记录：
 * 	2024/1/16: 初版。 刘言。
***********************************************************************************/
#include "mcu_flash.h"
#include "mcu.h"


void OcpFlash_WritePage(u32 page_addr, const u8 *buff)
{
    FMC_ErasePage(page_addr);
    ProgramPage(page_addr, 512, (u8 *)buff);
}


void OcpFlash_Read(u8 *buff, u32 addr, u32 length)
{
    u32 dat;    // 一次读出的数据
    u32 acc_addr = addr & 0xFFFFFFFC;   // 实际访问的起始地址
    u8 diff = addr - acc_addr;      // 读取起始地址与实际访问地址的偏移（丢弃几个字节）
    u32 acc_len = length + diff;    // 实际要读的长度
    u32 remin_len = acc_len;    // 剩余要读的长度
    while(remin_len)
    {
        dat = FMC_Read(acc_addr);   // 一次读出4字节
        if(remin_len == acc_len)    // 头部处理
        {
            u8 alen = 4 - diff; // 有效数据个数
            if(remin_len < alen)alen = remin_len;
            memcpy(buff, (u8 *)(&dat) + diff, alen);
            buff += alen;
        }
        else if(remin_len < 4)    // 尾部处理
        {
            memcpy(buff, (u8 *)(&dat), remin_len);
            buff += remin_len;
        }
        else
        {
            memcpy(buff, (u8 *)(&dat), 4);
            buff += 4;
        }
        if(remin_len > 4)remin_len -= 4;
        else remin_len = 0;
    }
}




